package com.fowo.api.sys.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.fowo.api.common.lang.ExceptionRunnable;
import com.fowo.api.common.model.RException;
import com.fowo.api.sys.entity.SysUser;
import com.fowo.api.sys.model.*;
import com.fowo.api.user.model.CurrentUser;

import java.util.List;

import org.jetbrains.annotations.Nullable;

/**
 * 系统用户服务
 * @author yl_ls
 */
public interface SysUserService extends IService<SysUser> {
    /** 创建用户 */
    SysUser create(CreateSysUser model) throws RException;

    /** 使用用户名获取用户 */
    SysUser getByUsername(String username);

    /** 使用手机号获取用户 */
    SysUser getByMobile(String mobile);

    /** 使用用户编号返回当前用户包装 */
    CurrentUser getCurrentUserById(Long id);

    /**
     * 返回指定用户的所有权限字符串
     * @param id 用户编号
     * @param appId 应用编号（可空）
     */
    List<String> getAllAuthorityByUserId(Long id, Long appId);

    /** 不分页查询 */
    List<SysUserItemVo> search(SysUserSearch search);

    /** 分页查询 */
    Page<SysUserItemVo> searchPage(SysUserSearch search);

    /** 重置密码 */
    boolean resetPassword(Long id, ResetPassword resetPassword);

    /** 返回指定编号用户的视图模型 */
    SysUserVo getVoById(Long id);

    /** 更新用户信息 */
    boolean update(SysUserVo sysUserVo);

    /** 更新用户是否禁用 */
    boolean updateDisabled(Long id, Boolean isDisabled);

    /**
     * 检查密码是否正确
     * @param userId 用户编号
     * @param password 要检查的密码
     * @return 密码是否正确
     */
    boolean checkPassword(Long userId, String password);

    /** 用户更改密码（校验原始密码） */
    void changePassword(Long userId, ChangePassword changePassword);
    
    /**
     * 更新用户配置信息
     * @param userId 用户编号
     * @param key 配置键
     * @param setting 配置信息
     */
    boolean updateSetting(Long userId, String key, UserSetting setting);

    /**
     * 获取用户配置信息
     * @param userId 用户编号
     * @param key 配置键
     * @return 配置信息（可空）
     */
    UserSetting getSetting(Long userId, String key);

    /**
     * 获取满足参数条件的用户编号列表
     * @param deptIdList (可空)所属部门编号列表
     * @param deptCodeList (可空)所属部门代码列表
     * @param deepDeptIdList (可空)所属上级部门编号列表
     * @param deepDeptCodeList (可空)所属上级部门代码列表（匹配全部下属部门）
     * @param roleIdList (可空)所属角色编号列表
     * @param menuIdList (可空)可用菜单编号列表
     * @return
     */
    List<Long> getUserIdListBy(
        @Nullable
        List<Long> deptIdList, 
        @Nullable
        List<String> deptCodeList, 
        @Nullable
        List<Long> deepDeptIdList, 
        @Nullable
        List<String> deepDeptCodeList, 
        @Nullable
        List<Long> roleIdList,
        @Nullable
        List<Long> menuIdList
        );

    /**
     * 更新用户的登录失败状态
     * @param user
     */
    void updateUserLoginFail(SysUser user);

    /**
     * 根据用户ids获取用户信息
     * @param userIds 用户ids
     * @return
     */
    List<SysUser> queryUserList(List<Long> userIds);
}
